Amazon RDS プレビュー環境で PostgreSQL 17 Beta 2 が使えるようになっていたので修正された ON EMPTY 句デフォルト動作を確認してみた

Amazon RDS プレビュー環境で PostgreSQL 17 Beta 2 が使えるようになっていたので修正された ON EMPTY 句デフォルト動作を確認してみた

Clock Icon2024.07.01

いわさです。

Amazon RDS にはオハイオリージョンでのみプレビュー環境という、GA 前の一部エンジンバージョンを先行で評価できる機能があります。
2024 年 5 月末には PostgreSQL 17 Beta が使えるようになっていました。

そしてつい先日には PostgreSQL 公式でも 17 Beta 2 がリリースされていましたね。

この Amazon RDS プレビュー環境はプレビューであり運用環境で使うんじゃないよという前提があるためか、公式エンジンバージョンへの追従がえらい早いです。
今回の PostgreSQL 17 Beta 2 もすぐに使えるようになっていました。

いつものように最新エンジンバージョンの確認をしつつ、今回は Beta 1 からバグ修正された項目を確認してみましたので、その様子も紹介します。

プレビュー環境にアクセス

プレビュー環境(オハイオリージョン)に切り替えて新規 RDS for PostgreSQL インスタンスを作成します。
エンジンバージョンに「PostgreSQL 17.20240624-R1」が追加されていますね。

「PostgreSQL 17.20240520-R1」は Beta 1 です。
今回は Beta 1 と Beta2 の挙動の違いを確認したいでの次のように Beta 1 と Beta 2 のインスタンスを作成しました。

余談ですが、プレビュー環境では Graviton インスタンスを選択出来ないことに気が付きました。
今回は T3 を使っていきたいと思います。GA される際には T4G が使えるようになっているのだろうか。

17 Beta 2 インスタンスに接続してみましょう。

% psql -h hoge0701postgre.ca0mg86saazc.us-east-2.rds-preview.amazonaws.com -d hogedb -U postgres
Password for user postgres: 
psql (14.11 (Homebrew), server 17beta2)
WARNING: psql major version 14, server major version 17.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

hogedb=> 

サーバーバージョンが 17 Beta 2 であることが確認出来ます。

JSON_QUERY で ON EMPTY 句を省略した場合のデフォルト動作を確認

上記公式の 17 Beta 2 リリース通知では変更点のひとつに次が挙げられています。
17 の新機能として JSON 操作周りが強化されているのですが、その一つ JSON_QUERY で使える ON EMPTY を省略時のデフォルト挙動が修正されているようです。

Correctly enforce the default behavior of the ON EMPTY clause when it's not present in a SQL/JSON query.

で、さらに調べてみると上記の Issue と Commit がこちらになります。

まずは 17 Beta 1 の挙動から確認

% psql -h hoge0701postgre-before.ca0mg86saazc.us-east-2.rds-preview.amazonaws.com -d hogedb -U postgres
Password for user postgres: 
psql (14.11 (Homebrew), server 17beta1)
WARNING: psql major version 14, server major version 17.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

hogedb=> SELECT JSON_QUERY('[]', '$[*]' EMPTY ARRAY ON ERROR) a;
 a  
----
 []
(1 row)

ああなるほど、NULL が取得されるはずなのですが空配列が取得されていますね。
Issue によると Oracle では同じ挙動をするようですが、PostgreSQL としてはバグで、NULL ON EMPTYを明示的に指定した場合と同じ挙動であるべき。と言われています。

17 Beta 2 で修正されているか確認

hogedb=> SELECT JSON_QUERY('[]', '$[*]' EMPTY ARRAY ON ERROR) a;
 a 
---
 
(1 row)

17 Beta 2 では NULL となっています。
RDS でも 17 Beta 2 のパッチで取り込まれていますね。

さいごに

本日は Amazon RDS プレビュー環境で PostgreSQL 17 Beta 2 が使えるようになっていたので修正された ON EMPTY 句デフォルト動作を確認してみました。

良いですね。PostgreSQL に依存するプラットフォームやツールを開発されている方は、新しいバージョンの変更に備えるためにぜひご利用ください。
また、公式の GA は 2024 年の 9 ~ 10 月を予定しているので、今後もおそらく Beta や RC がプレビューでリリースされる可能性がありますのでウォッチしておきましょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.